package org.sanguine.tests.protei.springapp.mvc.services;

import org.sanguine.tests.protei.springapp.mvc.models.Goods;

import java.io.Serializable;
import java.util.List;

/**
 * Created by alex on 25.02.14.
 * Author: Alex Kuznetsov
 */

/**
 * Интерфейс сервисного объекта, осуществляющего обработку пользовательских CRUD-запросов
 * @param <T> - класс объекта-элемента
 */
public interface Service<T extends Serializable> {

    /**
     * Получить элемент из хранилища по идентификатору
     * @param id - идентификатор
     * @return - объект из хранилища или null если элемент не найден (или произошла внутренняя ошибка)
     */

    public T getById(String id);

    /**
     * Добавить новый элемент в хранилище, установленное значение идетификатора в расчет не принимается, для нового
     * элемента идентификатор генерируется хранилищем
     * @param newEntity - экземпляр сохраняемого элемента
     * @return - вновь созданный элемент или null - если операция не выполнена.
     */

    public T create(T newEntity);

    /**
     * Удалить элемент из хранилища
     * @param id - идентификатор удаляемого элемента
     * @return - true - операция выполнена, false - удаление не выполнено (элемент не найден, внутренняя ошибка)
     */
    boolean deleteById(String id);

    /**
     * Обновить элемент с указанным идентификатором в хранилище на представленный.
     * @param id - идентификатор обновляемого элемента
     * @param entity - новый элемент
     * @return - true - удачное завершение, false - обновление не выполнено (элемент не найден, внутренняя ошибка)
     */

    boolean updateById(String id, T entity);

    /**
     * Получить список элементов, находящихся в хранилище
     * @param page - номер страницы списка
     * @param length - количество запрашиваемых элементов в странице
     * @param list - список-контейнер, куда помещаются полученные элементы
     * @return - true - частичная выдача, в хранилище есть еще элементы, false - list содержит все оставщиеся элементы
     * хранилища, более элементов нет
     */

    boolean getAll(int page, int length, List<T> list);
}
